import axios from 'axios'
import type { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
import { message } from 'ant-design-vue'

// 扩展 axios 配置类型
declare module 'axios' {
  export interface InternalAxiosRequestConfig {
    skipErrorMessage?: boolean // 是否跳过错误提示
  }
}

// 创建 axios 实例
const request: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:9090',
  timeout: 15000,
  withCredentials: true, // 携带 cookie，支持 session
})

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 可以在这里添加 token 等
    return config
  },
  (error) => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  },
)

// 响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse) => {
    const res = response.data

    // 如果返回的状态码不是 200，则认为是错误
    if (res.code !== 200) {
      // 检查是否跳过错误提示
      const skipErrorMessage = response.config.skipErrorMessage

      // 如果是未登录错误或配置了跳过错误提示，不显示错误消息
      if (res.code !== 40100 && !skipErrorMessage) {
        message.error(res.msg || '请求失败')
      }

      return Promise.reject(new Error(res.msg || '请求失败'))
    }

    return res
  },
  (error) => {
    console.error('响应错误:', error)

    // 检查是否跳过错误提示
    const skipErrorMessage = error.config?.skipErrorMessage

    if (!skipErrorMessage) {
      if (error.response) {
        const status = error.response.status

        switch (status) {
          case 401:
            message.error('未登录或登录已过期')
            break
          case 403:
            message.error('没有权限访问')
            break
          case 404:
            message.error('请求的资源不存在')
            break
          case 500:
            message.error('服务器错误')
            break
          default:
            message.error(error.response.data?.msg || '请求失败')
        }
      } else {
        message.error('网络错误，请检查网络连接')
      }
    }

    return Promise.reject(error)
  },
)

export default request

